//package all.multi;
//
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.concurrent.atomic.AtomicBoolean;
//import java.util.concurrent.atomic.AtomicInteger;
//import java.util.concurrent.locks.Condition;
//import java.util.concurrent.locks.ReentrantLock;
//
///**
// * @author by zhangleishuidihuzhu.com
// * @Date 2023/3/20 20:14
// */
//public class PrintInOrder {
//    public static void main(String[] args) {
////        Foo foo = new Foo();
////
////        int[] arr = new int[]{3,2,1};
//
//        Foobar foobar = new Foobar(1);
//        new Thread(foobar::foo).start();
//
//        new Thread(foobar::bar).start();
//    }
//
//    private static void multiInvoke(Foo foo, int[] arr) {
//        ReentrantLock lock = new ReentrantLock();
//        Condition one = lock.newCondition();
//        Condition two = lock.newCondition();
//
//        ExecutorService es = Executors.newFixedThreadPool(3);
//
//        for (int i : arr) {
//            if(i == 1) {
//                es.submit(foo::first);
//            }else if(i == 2) {
//                es.submit(foo::second);
//            }else if(i == 3) {
//                es.submit(foo::third);
//            }
//        }
//
//        es.shutdown();
//    }
//}
//
//class Foo{
//
//    volatile int num = 0;
//
//    void first() {
//        System.out.println("first");
//        num++;
//
//    }
//
//    void second() {
//        while (num != 1) {}
//        System.out.println("second");
//        num++;
//    }
//
//    void third() {
//        while (num != 2) {}
//        System.out.println("third");
//    }
//}
//
//class Foobar {
//
//    private int n;
//
//    ReentrantLock lock = new ReentrantLock();
//
//    Condition foo = lock.newCondition();
//
//    volatile boolean flag = false;
//
////    AtomicBoolean flag = new AtomicBoolean();
//
//    public Foobar(int n){
//        this.n = n;
//    }
//
//    public void foo() {
//        for (int i = 0; i < n; i++) {
//            lock.lock();
//            try{
//                if(flag) {
//                    foo.await();
//                }
//
//                flag = true;
//                foo.signalAll();
//
//            }finally {
//                lock.lock();
//            }
//
//
//            while (flag.get()) {}
//            System.out.print("foo");
//            flag.set(true);
//        }
//    }
//
//    public void bar() {
//        for (int i = 0; i < n; i++) {
//            while (!flag.get()) {}
//            System.out.print("bar");
//            flag.set(false);
//        }
//    }
//}
